home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / dsp / dspgroup / bell212.arc / DRUN1.ASM < prev    next >
Encoding:
Assembly Source File  |  1986-07-25  |  11.2 KB  |  249 lines

  1.        TITL ' TMS7041 MODEM RUN CODE '
  2.        IDT  'RUN1'
  3.        OPTION XREF,TUNLST
  4. ************************************************************
  5. **  This code handles the run time operation and          **
  6. **  communication of the modem.  This includes the DTE    **
  7. **  interface, 320 interface, and overspeed operations.   **
  8. **                                                        **
  9. **  Written by Peter Ehlig                                **
  10. **                                                        **
  11. **  Revision 1.0  11/12/85  PETER EHLIG                   **
  12. **  Revision 1.1   1/28/86  PETER EHLIG                   **
  13. **  Revision 1.2   5/20/86  PETER EHLIG                   **
  14. **                                                        **
  15. **  COPYRIGHT TEXAS INSTRUMENTS,  07/25/86                **
  16. **                                                        **
  17. ************************************************************
  18. *
  19. *   DEFINITIONS AND REFERENCES
  20.        DEF  GO320
  21.        REF  TOP,SCRAM,DSCRAM,PRINT
  22. *
  23.        PAGE
  24.        COPY DTE2.EQU
  25. *******----------------------------------------*******
  26. *****     DSP XMIT/RECEIVE ROUTINES              *****
  27. *******----------------------------------------*******
  28. *
  29. GO320  CLR   CMSTAT        ; clear com status reg
  30.        CLR   S1718         ; initialize scrambler history
  31.        CLR   S9TO16        ; as all zeros
  32.        CLR   S1TO8         ;
  33.        CLR   D1718         ; initialize descrambler history
  34.        CLR   D9TO16        ; as all zeros
  35.        CLR   D1TO8         ;
  36.        ANDP  %NOT0,CPORT   ; activate CTS to DTE
  37.        ANDP  %>3F,BPORT    ; togglE B6,7 to
  38.        ORP   %>C0,BPORT    ; reset 320 ACK lines
  39. *
  40. *    START UP MODEM OR DLB TEST
  41. *
  42. STOPB2 MOV   %3,XDIBIT      ; SET DIBIT TO MARKS
  43.        CALL  @SCRAM         ; AND SCRAMBLE IT
  44.        BTJO  %BIT0,SWSTAT,SENDAT ; SEND DATA IF CD SET
  45.        BTJO  %BIT2,SWSTAT,SENDAT ; OR IN ORG. MODE
  46.        MOVP  %>3F,DDDR      ; TURN DPORT LINES OUT
  47.        ORP   %>3C,DPORT     ; SEND CMND TO XMIT TONE
  48.        JMP   SNDTON         ;
  49. *
  50. SENDAT MOV   XDIBIT,A       ; HOLD IT FOR TRANSMIT
  51.        OR    %>20,A         ; OR IN COMMAND BITS
  52.        MOVP  %>3F,DDDR      ; TURN DPORT LINES OUT
  53.        ANDP  %>C0,DPORT     ; CLEAR OFF CURRENT BITS
  54.        ORP   A,DPORT        ; SEND OUT SCRAM MARKS
  55. SNDTON ANDP  %NOT6,BPORT    ; LATCH NEW DATA
  56.        ORP   %BIT6,BPORT    ; RESET READ BIT
  57.        MOVP   %>00,DDDR     ; Reset DPORT as all inputs
  58. *  TRANSMIT UNSCRAMBLED MARKS AND RECEIVE
  59. MRC1   BTJZP %BIT7,DPORT,MRC2   ; WAIT FOR WRITE FROM 320
  60. CHKTCH BTJOP %BIT6,DPORT,RECDTE ; WAIT FOR READ FROM 320
  61.        BR    @MRC3              ; PROCESS READ FROM 320
  62. RECDTE BTJOP %BIT1,SSTAT,DTEGET ; IS DTE REC BUF FULL
  63. XMTDTE BTJOP %BIT0,SSTAT,DTEPUT ; IS DTE TRANS BUF EMPTY
  64.        JMP   MRC1               ; LOOK AGAIN
  65. *
  66.        PAGE
  67. *
  68. *    CODE INTERFACE TO DTE
  69. *
  70. DTEGET EQU   $
  71.        MOVP  RXBUF,A            ; YES, GET THE CHARACTER?
  72.        BTJZ  %BIT4,SWSTAT,OVRSQT  ; IS ESC CODE ENABLED
  73.        CMP   %>1B,A             ; IF A <> ESCAPE
  74.        JNE   OVRSQT             ; THEN CONTINUE
  75.        BR    @TOP               ; ELSE RETURN TO MONITOR
  76. SQRT   CLR   A                  ; CLEAR COMMAND BUFFER
  77.        MOVP  %>3F,DDDR          ; TURN DPORT OUT
  78.        MOVP  A,DPORT            ; RESET COMMAND
  79.        ANDP  %NOT6,BPORT        ; RESET THE READ ACKNOWLEDGE
  80.        ORP   %BIT6,BPORT        ; LATCH SQUELCH COMMAND
  81.        MOVP  %>00,DDDR          ; TURN DPORT IN
  82.        ANDP  %NOT0,BPORT        ; TURN OFF THE CODEC
  83.        BR    @TOP               ; AND RETURN TO MONITOR
  84. OVRSQT INC   XCHCNT             ; INCREMENT BYTE COUNT
  85.        BTJO  %BIT5,CMSTAT,DTEGER    ; CHECK FOR BUF2 FULL
  86.        BTJO  %BIT3,CMSTAT,DTEG1     ; CHECK IF 1ST CHAR
  87.        OR    %BIT7,CMSTAT       ; FLAG FOR START BIT
  88.        MOV   A,XBUF1            ; IF SO THEN RESTART
  89.        MOV   %>A,XBTCNT         ; RESET XMT COUNT
  90.        OR    %BIT3,CMSTAT       ; SET TRANS ACTIVE
  91.        JMP   XMTDTE             ; CHECK OUTPUT
  92. DTEG1  MOV   A,XBUF2            ; SAVE IT IN THE BUF2
  93.        OR    %BIT5,CMSTAT       ; SET BUF2 FULL FLAG
  94.        JMP   XMTDTE             ; CHECK OUTPUT
  95. *
  96. DTEGER EQU   $                  ; SQUELCH THE
  97.        MOVD  %BUFERR,MSGL       ; SEND ERROR MESSAGE
  98.        CALL  @PRINT             ; TO USER TERMINAL
  99.        BR    @SQRT              ; EXIT ROUTINE
  100. *
  101. DTEPUT EQU   $
  102.        BTJZ  %BIT4,CMSTAT,MRC1   ; CHECK FOR CHARACTER READY
  103.        MOV   RBUF2,A              ; GET BUFFERED CHARACTER
  104.        MOVP  A,TXBUF            ; SEND IT TO THE DTE
  105.        AND   %NOT4,CMSTAT       ; RESET BUFFER FULL FLAG
  106.        JMP   MRC1               ; RETURN TO FLAG LOOP
  107. *
  108.        PAGE
  109. *    RECEIVE DIBITS FROM THE 320
  110. *    320 just finished writing to the buffer
  111. *    DPORT IS SET TO ALL INPUTS EXCEPT WHEN 7742 IS OUTPUT
  112. MRC2   EQU   $
  113. *---   MOVP  %>30,DDDR          ; PUT DIBIT RANGE AS INPUT
  114.        ANDP  %NOT7,BPORT       ; TOGGLE B7 TO ENABLE RECEIVE
  115. *             LATCH AND TO RESET 320 WRITE ACKNOWLEDGE(WACK)
  116. *
  117.  
  118.        MOVP  DPORT,A            ; GET THE RETURNED DATA
  119.        MOV   A,XDIBIT           ; AND HOLD IT IN XDIBIT
  120.        ORP   %BIT7,BPORT       ; TURN LATCHES OFF AFTER READ
  121.        BTJZ  %BIT5,A,CHKTCH     ; IF NO CARRIER THEN DONE
  122.        AND   %3,XDIBIT          ; AND OFF STATUS
  123.        CALL  @DSCRAM            ; DESCRAMBLE IT
  124.        BTJO  %BIT2,CMSTAT,RCHAR1  ;CHECK FOR REC CHAR ACTIVE
  125.        RRC   XDIBIT             ; CHECK DIBIT0
  126.        JC    RNB                ; IF HIGH THEN CHECK NEXT
  127.        RRC   XDIBIT             ; SAVE LSB OF RECEIVE CHAR
  128.        RRC   RBUF1              ; IN CHAR HOLD REG
  129.        MOV   %7,RBTCNT          ; SET REC BIT COUNT REG
  130.        JMP   RCHAR0             ; SKIP OVER NEXT CHECK
  131. *
  132. RNB    RRC   XDIBIT             ; CHECK DIBIT1
  133.        JNC   OVRRNB             ; IF HIGH CHECK XMTCHR
  134.        BR    @CHKTCH            ; ELSE GO BACK TO LOOP
  135. OVRRNB MOV   %8,RBTCNT          ; SET REC BIT COUNT REG
  136. RCHAR0 OR    %BIT2,CMSTAT       ; SET REC CHAR ACTIVE
  137.        BR    @RECDTE            ; CHECK DTE
  138. *
  139. RCHAR1 SUB   %2,RBTCNT          ; CHECK BIT POSITION
  140.        JP    RCHAR3             ; IF > 0 GET 2 BITS
  141.        JZ    RCHAR2             ; IF = 0 GET 1 BIT
  142.        RRC   XDIBIT             ; PUT BIT7 INTO
  143.        RRC   RBUF1              ; REC CHAR HOLD REG
  144.        MOV   RBUF1,RBUF2           ; PUT CHAR IN OUT BUFFER
  145.        OR    %BIT4,CMSTAT       ; SET BUFFER FULL FLAG
  146.        CLR   RBUF1              ; CLEAR BUFFER FOR NEXT CHAR
  147.        AND   %NOT2,CMSTAT       ; RESET REC CHAR ACTIVE
  148.        JMP   RNB                ; CHECK DIBIT1 FOR START BIT
  149. *
  150. RCHAR2 RRC   XDIBIT             ; SAVE MSB OF RECEIVE CHAR
  151.        RRC   RBUF1              ; INTO REC CHAR HOLD REG
  152.        RRC   XDIBIT             ; PUT BIT7 INTO
  153.        RRC   RBUF1              ; REC CHAR HOLD REG
  154.        MOV   RBUF1,RBUF2           ; PUT CHAR IN OUT BUFFER
  155.        OR    %BIT4,CMSTAT       ; SET BUFFER FULL FLAG
  156.        CLR   RBUF1              ; CLEAR BUFFER FOR NEXT CHAR
  157.        AND   %NOT2,CMSTAT       ; RESET REC CHAR ACTIVE
  158.        BR    @RECDTE            ; CHECK DTE
  159. *
  160. RCHAR3 RRC   XDIBIT             ; MOVE DIBIT0 TO
  161.        RRC   RBUF1              ; REC CHAR HOLD REG
  162.        RRC   XDIBIT             ; MOVE DIBIT1 TO
  163.        RRC   RBUF1              ; REC CHAR HOLD REG
  164.        BR    @RECDTE            ; CHECK DTE
  165. *
  166.        PAGE
  167. *
  168. *   SEND DIBITS TO THE 320
  169. *   320 just read from the latches
  170. *
  171. MRC3   EQU   $
  172.        BTJO  %BIT3,CMSTAT,TCHAR0    ; IS TRANS CHAR ACTIVE
  173.        BR    @STOPB2            ; IF NOT SEND STOPBITS
  174. TCHAR0 CLR   XDIBIT             ; CLEAR OUT DIBIT REG
  175.        SUB   %2,XBTCNT          ; CHECK POSITION
  176.        JP    TCHAR6             ; > 2 MEANS TRANSMIT BITS
  177.        JNZ   TCHAR3             ; IF PATTERN ONE THEN ODD
  178.        RRC   XBUF1              ; GET BIT 7 FROM CHAR
  179.        JNC   TCHO0              ; IF NO CARRY DIBIT0=0
  180.        OR    %BIT0,XDIBIT       ; ELSE DIBIT0=1
  181. TCHO0  BTJO  %BIT5,CMSTAT,TCHAR1    ; IF BUF2 EMPTY
  182.        AND   %NOT3,CMSTAT       ; RESET TRAN ACTIVE BIT
  183.        OR    %BIT1,XDIBIT       ; SET DIBIT1 TO STOP
  184.        JMP   TCHSND             ; AND SEND DIBIT
  185. TCHAR1 CMP   %9,XCHCNT          ; CHECK CHAR COUNT
  186.        JL    TCHAR2             ; IF < DON'T DELETE STOPBIT
  187.        CLR   XCHCNT             ; CLEAR BYTE COUNT
  188.        AND   %NOT1,XDIBIT       ; SEND DIBIT1 TO START
  189.        MOV   XBUF2,XBUF1          ; LOAD IN NEW CHAR
  190.        MOV   %9,XBTCNT          ; SET BIT COUNT
  191.        AND   %NOT5,CMSTAT       ; RESET BUF2 FULL FLAG
  192.        JMP   TCHSND             ; SEND THE DIBIT
  193. TCHAR2 OR    %BIT1,XDIBIT       ; SEND DIBIT1 TO STOP
  194.        MOV   XBUF2,XBUF1          ; LOAD IN NEW CHAR
  195.        OR    %BIT7,CMSTAT       ; FLAG IN START BIT
  196.        MOV   %>A,XBTCNT         ; SET BIT COUNT
  197.        AND   %NOT5,CMSTAT       ; RESET BUF2 FULL FLAG
  198.        JMP   TCHSND             ; SEND THE DIBIT
  199. TCHAR3 BTJO  %BIT5,CMSTAT,TCHAR4    ; IF BUF2 EMPTY
  200.        AND   %NOT3,CMSTAT       ; RESET TRAN ACTIVE BIT
  201.        BR    @STOPB2            ; AND SEND MARKS
  202. TCHAR4 CMP   %9,XCHCNT          ; CHECK CHAR COUNT
  203.        JL    TCHAR5             ; IF < DON'T DELETE STOPBIT
  204.        CLR   XCHCNT             ; CLEAR BYTE COUNT
  205.        MOV   XBUF2,XBUF1          ; LOAD IN NEW CHAR
  206.        OR    %BIT7,CMSTAT       ; FLAG IN START BIT
  207.        MOV   %8,XBTCNT          ; SET BIT COUNT
  208.        AND   %NOT5,CMSTAT       ; RESET BUF2 FULL FLAG
  209.        JMP   TCHAR6             ; SEND THE DIBIT
  210. TCHAR5 MOV   %1,XDIBIT          ; SEND STOP THEN START
  211.        MOV   XBUF2,XBUF1        ; LOAD IN NEW CHAR
  212.        MOV   %9,XBTCNT          ; SET BIT COUNT
  213.        AND   %NOT5,CMSTAT       ; RESET BUF2 FULL FLAG
  214.        JMP   TCHSND             ; SEND THE DIBIT
  215. TCHAR6 BTJZ  %BIT7,CMSTAT,TCHAR7    ; START BIT NEEDED
  216.        AND   %NOT7,CMSTAT       ; RESET START BIT FLAG
  217.        JMP   TCHO1              ; SKIP DIBIT1
  218. TCHAR7 RRC   XBUF1              ; GET NEXT BIT OF CHAR
  219.        JNC   TCHO1              ; IF LOW SKIP BIT SET
  220.        OR    %1,XDIBIT          ; ELSE SET DIBIT0 TO ONE
  221. TCHO1  RRC   XBUF1              ; GET NEXT BIT OF CHAR
  222.        JNC   TCHSND             ; IF LOW SKIP BIT SET
  223.        OR    %2,XDIBIT          ; ELSE SET DIBIT1 TO ONE
  224. TCHSND EQU   $
  225.        CALL  @SCRAM             ; AND SCRAMBLE IT
  226.        BTJO  %BIT0,SWSTAT,GOT212 ; If CD set or in ORG mode
  227.        BTJO  %BIT2,SWSTAT,GOT212 ; cont, Else send ans. tone
  228.        MOVP  %>3F,DDDR         ; SETUP DPORT FOR OUTPUT
  229.        MOVP  %>3C,DPORT        ; RUN 212 ANS/W. ANS.TONE
  230.        BR    @NO212            ; Send it to 320
  231. *
  232. GOT212 MOV   XDIBIT,A              ; HOLD IT FOR TRANSMIT
  233.        MOVP  %>3F,DDDR          ; POINT DPORT OUT
  234.        ANDP  %>F0,DPORT         ; CLEAR OUT DIBIT VALUE
  235.        ORP   A,DPORT            ; SEND TO PORT
  236. NO212  ANDP  %NOT6,BPORT        ; Latch data into xmt.buffer
  237.        ORP   %BIT6,BPORT        ; and reset Read Ack(RACK)
  238.        MOVP  %>00,DDDR          ; Reset DPORT as all inputs
  239.        BR    @RECDTE            ; WAIT FOR RETURN LOOP
  240. *
  241. *******----------------------------------------*******
  242. *****    screen messages - text statements       *****
  243. *******----------------------------------------*******
  244. BUFERR TEXT   'DTE BUFFER OVERFLOW ERROR'
  245.        BYTE   0
  246. *
  247. *
  248.        END
  249.